// 获取
export function getItem(key) {
  // 这个拿出来的 value 有哪些情况？
  // 1. 有可能拿不到值，没有这个key，返回的就是null
  // 2. 有这个key，可以拿到值，那么这个值又有哪些情况呢？
  //   2.1 简单（基本）数据类型
  //   2.2 复杂（引用）数据类型
  //   2.3 补充说明1：不管是基本数据类型还是引用数据类型，都是字符串，都需要反序列表，因为 false 拿出来也是字符串的 false
  //   2.4 补充说明2：其实，对于 JSON.parse 这个反序列化方法而言，都是无差别的，如果能反序列化成功，那就成功了，如果不能成功，那就报错了
  const value = localStorage.getItem(key)
  try {
    return JSON.parse(value)
  } catch (err) {
    // 如果进了这里，说明 JSON.parse(value) 报错了，说明转换不了，那么就给原来的值 value
    return value
  }
}

// 设置
export function setItem(key, value) {
  // 不管 value 是什么数据类型，都可以先用 JSON.stringify 序列化成字符串，因为 localStorage 本身也只能存储字符串，所以，直接序列化后存入 localStorage 即可
  localStorage.setItem(key, JSON.stringify(value))
}

// 移除，跟原始的 localStorage 一样，没有特殊的逻辑的处理，封装这个函数，只有一个目的：为了保证我们的 storage.js 模块显得更完整，而不是一个没有 removeItem 的残缺版
export function removeItem(key) {
  localStorage.removeItem(key)
}

// 默认导出所有按需导出的内容
// 补充说明：这个将所有按需导出的内容，整合到一起，进行默认导出，其实完全没有必要，因为在导入时只要换一个导入语法就能实现：import * as xxx from 'xxx'
export default {
  getItem,
  setItem,
  removeItem,
}
